[译]Virtual Extension Methods(or Defender Methods) in Java 8

原文:http://www.javabeat.net/virtual-extension-methods-in-java-8/

作为JSR-335(Lambda项目)的一部分,Java中增加了对闭包的支持。为了支持闭包的使用,在已存在的Java API(Collection APIs为主)中有一些小的改变。其中一个改变就是将要介绍的虚拟扩展方法(Virtual Extension Methods)。 您也可以阅读:

•  Java 8.0 Tutorials

•  Java 7.0 Tutorials

•  New Features in Java 7.0

•  G1 Garbage Collector in Java 7.0

我们都知道接口不能包含任何方法的实现。为了给新的API提供对闭包的支持并且让使用了这些API的类可以运行在多内核平台上,比如collection中的forEach、map、reduce、filter等方法可以直接被添加到Collection类,或者创建一个新的接口并且让所有collection API实现它,也可以让用户API实现这个新的接口。前两种方法会破坏已经存在的代码,因为接口中的新方法缺少实现。最后一种方法是可行的,但是也不能在外部提高collection API。

处理JSR-335的团队想到的办法是为接口添加default实现,这种方式就为接口实现者提供了覆写方法或就使用该方法的操作。这样在不破坏原有代码结构的情况下新的API就可以被添加到Collection类中同时还为已存在的代码提供了完整的闭包支持。详细深入的文章点这里

让我们看一下虚拟扩展方法的例子:

1
2
3
4
5
6
7
interface TestInterface{
public void testMe();
public void aDefaulter() default{
System.out.println("Default from interface");
}
}

使用“default”关键字我们就可以向已存在的接口中添加新的方法,如果实现接口的类没有覆写这个default方法则它可以直接使用这个default实现。就像:

1
2
3
4
5
6
7
8
9
10
11
12
public class DefenderMethods{
public static void main(String[] args){
InterfaceImplementer imp = new InterfaceImplementer();
imp.testMe();
imp.aDefaulter();
}
}
class InterfaceImplementer implements TestInterface{
public void testMe(){
System.out.println("Hello World!");
}
}

上面的代码会输出:

1
2
3
4
~/javaP/java8$ javac DefenderMethods.java
~/javaP/java8$ java DefenderMethods
Hello World!
Default from interface

更进一步,我们可以在接口实现类中覆写aDefaulter方法,如下:

1
2
3
4
5
6
7
8
9
class InterfaceImplementer implements TestInterface{
public void testMe(){
System.out.println("Hello World!");
}
public void aDefaulter(){
System.out.println("Defautler overridden from class");
}
}

上面的代码输出如下:

1
2
3
4
~/javaP/java8$ javac DefenderMethods.java
~/javaP/java8$ java DefenderMethods
Hello World!
Defautler overridden from class

DefenderMethods类的字节码仍然使用invokevirtual操作码调用default方法产生,这表明被调用过程同其他任何普通接口方法一样。

在接下来的文章中,我会讲一些覆写规则、方法调用规则类似的概念,还有一些JDK8中使用了这些特性的例子代码。

相关文章;

1. HashCode and equals methods

2. Generic Methods in Java 5.0

3. Proxy Design Pattern

4. Hiding and Overriding Methods In Java

5. Using Lambda Expressions of Java 8 in Java FX event handlers